#include "moteurReseau.h"

void MoteurReseau::executer() {
    if (!this->fileMessages.empty()) {
        traiterMessage(this->fileMessages.front());
        this->fileMessages.pop();
    }
}

void MoteurReseau::traiterMessage(Message m) {
    switch (m.getType()) {
        case DEMANDE_INVITATION:
            traiterDemandeInvitation(m);
            break;
        case ACCEPTER_PARTIE:
            traiterAccepterPartie(m);
            break;
        case DEPLACEMENT_PIECE:
            traiterDeplacementPiece(m);
            break;
        case CHOIX_PROMOTION:
            traiterChoixPromotion(m);
            break;
        //...
    }
}

void MoteurReseau::traiterDemandeInvitation(Message m) {
    sock.connectToHost(QString(m.getChaine(0).c_str()),port);
    if (sock.waitForConnected(3000)) {
        QTextStream texte(&sock); //on associe un flux à la socket
        texte << "Invitation#" << sock.localAddress().toString() << endl;        //on écrit dans le flux
        sock.disconnectFromHost();
    }
}

void MoteurReseau::traiterAccepterPartie(Message m) {
    sock.connectToHost(ip,port);
    if (sock.waitForConnected(3000)) {
        QTextStream texte(&sock); //on associe un flux à la socket
        texte << "Partie Acceptee#" << sock.localAddress().toString() << endl;        //on écrit dans le flux
        sock.disconnectFromHost();
    }
}

void MoteurReseau::traiterDeplacementPiece(Message m) {
    sock.connectToHost(ip,port);
    if (sock.waitForConnected(3000)) {
        QTextStream texte(&sock); //on associe un flux à la socket
        texte << "Deplacement Piece#" << sock.localAddress().toString() << "#" << m.getEntier(0) << "#" << m.getEntier(1) << "#" << m.getEntier(2) << "#" << m.getEntier(3) << endl;        //on écrit dans le flux
        sock.disconnectFromHost();
    }
}

void MoteurReseau::traiterChoixPromotion(Message m) {
    sock.connectToHost(ip,port);
    if (sock.waitForConnected(3000)) {
        QTextStream texte(&sock); //on associe un flux à la socket
        texte << "Choix Promotion#" << sock.localAddress().toString() << "#" << m.getEntier(0) << endl;        //on écrit dans le flux
        sock.disconnectFromHost();
    }
}



void MoteurReseau::demande_connexion() {
    //emit vers_IHM_connexion(); //on envoie un signal à l’ihm
    //on crée une nouvelle socket pour ce client
    sockNewClient = serveur->nextPendingConnection();
    //si on reçoit des données, le slot lecture() est appelé
    QObject::connect(sockNewClient, SIGNAL(readyRead()),this, SLOT(lectureServeur()));
}
void MoteurReseau::lectureServeur() {
    ofstream file("net.log", ios::out | ios::app);

    QString ligne;
    if (sockNewClient->canReadLine()) {
        ligne = sockNewClient->readLine();
        file << "Ligne socket: " << ligne.toStdString() << endl;

        if (ligne.startsWith("Invitation#")) {
            ip = ligne.section('#', 1, 1);
            Message msg(INVITATION);
            msg.ajouterChaine(ip.toStdString());
            moteurGraphique->envoyerMessage(msg);

            QTextStream texte(sockNewClient);        //création d’un flux pour écrire dans la socket
            texte << "ok"<<endl;             //message à envoyer au client

            file << "Invitation recue !" << endl;
        }
        else if (ligne.startsWith("Partie Acceptee#")) {
            ip = ligne.section('#', 1, 1);
            Message msg(PARTIE_ACCEPTEE);
            msg.ajouterChaine(ip.toStdString());
            moteurGraphique->envoyerMessage(msg);

            QTextStream texte(sockNewClient);        //création d’un flux pour écrire dans la socket
            texte << "ok"<<endl;             //message à envoyer au client

            file << "Acceptation recue !" << endl;
        }
        else if (ligne.startsWith("Deplacement Piece#")) {
            //ip = ligne.section('#', 1, 1);

            Message msg(PIECE_CLIQUEE);
            msg.ajouterEntier(ligne.section('#', 2, 2).toInt());   // colonne depart
            msg.ajouterEntier(ligne.section('#', 3, 3).toInt());   // ligne depart
            moteurJeu->envoyerMessage(msg);

            Message msg2(PIECE_CLIQUEE);
            msg2.ajouterEntier(ligne.section('#', 4, 4).toInt());   // colonne arrivee
            msg2.ajouterEntier(ligne.section('#', 5, 5).toInt());   // ligne arrivee
            moteurJeu->envoyerMessage(msg2);

            QTextStream texte(sockNewClient);        //création d’un flux pour écrire dans la socket
            texte << "ok"<<endl;             //message à envoyer au client

            file << "Deplacement recu !" << endl;
        }
        else if (ligne.startsWith("Choix Promotion#")) {
            //ip = ligne.section('#', 1, 1);

            Message msg(CHOIX_PROMOTION);
            msg.ajouterEntier(ligne.section('#', 2, 2).toInt());   // type de piece
            moteurJeu->envoyerMessage(msg);

            QTextStream texte(sockNewClient);        //création d’un flux pour écrire dans la socket
            texte << "ok"<<endl;             //message à envoyer au client

            file << "Promotion recue !" << endl;
        }
    }
    file.close();
}

void MoteurReseau::connexion_OK() {
}
void MoteurReseau::lectureClient() {
    ofstream file("net.log", ios::out | ios::app);

    QString ligne;
    while(sock.canReadLine())       //tant qu’il y a quelquechose à lire dans la socket
    {
       ligne = sock.readLine();     //on lit une ligne
       file << ligne.toStdString() << endl;
    }

    file.close();
}

